home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / csim / source.lha / source / C++SIM / Link.cc < prev    next >
C/C++ Source or Header  |  1993-06-14  |  2KB  |  136 lines

  1. /*
  2.  * Copyright (C) 1993
  3.  *
  4.  * Department of Computing Science,
  5.  * The University,
  6.  * Newcastle upon Tyne,
  7.  * UK.
  8.  */
  9.  
  10.  
  11. /*
  12.  * This class defines the elements of the linked lists within SIMSET.
  13.  */
  14.  
  15.  
  16. #ifndef LINK_H_
  17. #include "Link.h"
  18. #endif
  19.  
  20. #ifndef HEAD_H_
  21. #include "Head.h"
  22. #endif
  23.  
  24.  
  25. Link::Link ()
  26.             : prev(0),
  27.           next(0),
  28.           inList(false)
  29. {
  30. }
  31.  
  32. Link::~Link () { RemoveElement(); }
  33.  
  34. void Link::RemoveElement ()
  35. {
  36.     if (prev)
  37.     prev->next = next;
  38.  
  39.     if (next)
  40.     next->prev = prev;
  41.  
  42.     inList = false;
  43. }
  44.  
  45. Link* Link::Out ()
  46. {
  47.     RemoveElement();
  48.     return this;
  49. }
  50.  
  51. void Link::InTo (Head* list)
  52. {
  53.     if (list)
  54.     {
  55.     list->AddLast(this);
  56.     return;
  57.     }
  58.     
  59.     (void) Out();
  60. }
  61.  
  62. void Link::Precede (Link* element)
  63. {
  64.     if (!element)
  65.     (void) Out();
  66.     else
  67.     if (!element->inList)
  68.         (void) Out();
  69.     else
  70.     {
  71.         if (inList)
  72.         (void) Out();
  73.         
  74.         element->addBefore(this);
  75.     }
  76. }
  77.  
  78. void Link::Follow (Link* element)
  79. {
  80.     if (!element)
  81.     (void) Out();
  82.     else
  83.     if (!element->inList)
  84.         (void) Out();
  85.     else
  86.     {
  87.         if (inList)
  88.         (void) Out();
  89.         
  90.         element->addAfter(this);
  91.     }
  92. }
  93.  
  94. void Link::addAfter (Link* toAdd)
  95. {
  96.     toAdd->inList = true;
  97.     toAdd->prev = this;
  98.  
  99.     if (!next)
  100.     next = toAdd;
  101.     else
  102.     {
  103.     next->prev = toAdd;
  104.     toAdd->next = next;
  105.     next = toAdd;
  106.     }
  107. }
  108.  
  109. void Link::addBefore (Link* toAdd)
  110. {
  111.     toAdd->inList = true;
  112.     toAdd->next = this;
  113.  
  114.     if (!prev)
  115.     prev = toAdd;
  116.     else
  117.     {
  118.     prev->next = toAdd;
  119.     toAdd->prev = prev;
  120.     prev = toAdd;
  121.     }
  122. }
  123.  
  124. void Link::Follow (Head* list)
  125. {
  126.     if (list)
  127.     list->AddFirst(this);
  128. }
  129.  
  130.  
  131. #ifdef NO_INLINES
  132. #  define LINK_CC_
  133. #  include "Link.n"
  134. #  undef LINK_CC_
  135. #endif
  136.